#include "biblioteca.h"
#include <time.h>

void inicializa_variaveis(){
    //seed = 11235813;
    //seed = 31415936;
    //seed = 7654321;
    //seed = 237142149;
    seed = 13111990;
    //seed = 1;
    //seed = time(NULL);
    srand(seed);
}

int main(int argc, char **argv){
    //sempre fazer isso primeiro!
    inicializa_variaveis();
    //pode vir a ser o corpo do algoritmo genético, ou parte integrante dele
    void teste1(){
        DP_INDI pop = create_population();
        register int i = 0;
        for ( ; i < SIZE_POP; ++i)
            imprime_individuo(pop[i]);
        //int (*pfunc)(const void*, const void*);
        //pfunc = compara_avaliacao_individuos;
        qsort(pop, SIZE_POP, sizeof(P_INDI), compara_avaliacao_individuos_const_void);
        printf("\n\n");
        for ( i = 0; i < SIZE_POP; ++i)
            imprime_individuo(pop[i]);
        DP_INDI pais = calloc(2, sizeof(P_INDI));
        torneio(pop, pais);
        printf("\nPai sorteado:\t");
        imprime_individuo(pais[0]);
        printf("\nPai sorteado:\t");
        imprime_individuo(pais[1]);
    }
    //teste da criacao de individuos
    void teste2(){
        int material1[] = {7,5,1,4,3,6,8,2,9,0};
        int material2[] = {3,4,8,7,5,2,6,1,9,0};
        printf("Pais:\n");
        INDI pai1 = create_individuo_com_material(material1);
        INDI pai2 = create_individuo_com_material(material2);
        //imprime ambos individuos
        imprime_individuo(&pai1);
        imprime_individuo(&pai2);
        int *filhos = crossover_ciclico(&pai1, &pai2);
        INDI filho1 = create_individuo_com_material(filhos);
        INDI filho2 = create_individuo_com_material(filhos+SIZE_MATERIAL);
        printf("Filhos:\n");
        imprime_individuo(&filho1);
        imprime_individuo(&filho2);
    }
    void teste3(){
        DP_INDI pop = create_population();
        executa_algoritmo_genetico(pop, torneio, crossover_ciclico, compara_avaliacao_individuos_const_void, avaliar_individuo, mutacao_local_troca);
    }
    void teste4(){
        DP_INDI pop1 = create_population();
        DP_INDI pop2 = calloc(SIZE_POP+TCROSS, sizeof(INDI));
        copy_population_to_other(pop1, pop2, SIZE_POP);
//        DP_INDI pop2 = copy_population(pop1);
        qsort(pop2, SIZE_POP, sizeof(P_INDI), compara_avaliacao_individuos_const_void);
        register int i;
        printf("População 1:\n");
        for( i = 0; i < SIZE_POP; ++i)
            imprime_individuo(pop1[i]);
        printf("População 2:\n");
        for( i = 0; i < SIZE_POP; ++i)
            imprime_individuo(pop2[i]);
    }
    //
    teste3();
    return 0;
}

